package org.totoro.memory.gc;

import org.totoro.memory.MemoryChunk;

import java.util.ArrayList;
import java.util.List;

/**
 * 串行gc
 * <p>
 * 使用串行回收器进行回收，这个参数会使新生代和老年代都使用串行回收器，新生代使用复制算
 * 法，老年代使用标记-整理算法。Serial收集器是最基本、历史最悠久的收集器，它是一个单线
 * 程收集器。一旦回收器开始运行时，整个系统都要停止。Client模式下默认开启，其他模式默认
 * 关闭。
 *
 * <p>
 *
 * <pre>
 *     内存区域特性回收算法介绍
 *
 *       新生代：复制算法
 *       老年代：标记整理算法
 * </pre>
 *
 * <pre>
 *     适合场景
 *          堆内存比较小，对性能要求比较低的程序
 * </pre>
 *
 * <pre>
 *     相关参数介绍
 *     -XX:+UseSerialGC     启用串行垃圾回收
 * </pre>
 * <p>
 *
 * @author daocr
 * @date 2020/3/7
 */
public class UseSerialGCTest {

    public static void main(String[] args) {

//        minorGc();
        fullGc();
    }

    /**
     * 年轻代 gc  别名 Minor GC
     * <p>
     * gc 日志解释
     *
     * <pre>
     *      Minor GC                 年轻代触发(DefNew) | 收前新生代大小（2767K），回收后大小（420K），总大小（6144K）|  堆回收前(2767K),回收后(1444K),堆总大小（19840K）
     *     [GC (Allocation Failure) [DefNew:            2767K->420K(6144K), 0.0053131 secs]                        2767K->1444K(19840K), 0.0054396 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
     * </pre>
     * <p>
     * vm : -Xms20m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintFlagsFinal
     */
    public static void minorGc() {
        List<byte[]> list = new ArrayList<>();
        list.add(MemoryChunk._1MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
    }

    /**
     * 老年代 gc   别名 full gc 或者 Major GC
     * <p>
     * 日志分析
     * <pre>
     *      Full GC                       老年代（Tenured） 前(10628K)->后(13681K) total(13696K)    Heap： 前(13700K),后(13681K),total（19840K）
     *     [Full GC (Allocation Failure) [Tenured: 10628K->13681K(13696K), 0.0042280 secs] 13700K->13681K(19840K), [Metaspace: 3101K->3101K(1056768K)], 0.0042479 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
     *
     * </pre>
     * <p>
     * vm : -Xms20m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintFlagsFinal
     */
    public static void fullGc() {

        List<byte[]> list = new ArrayList<>();

        list.add(MemoryChunk._1MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
    }

}
